在AWS EC2安装完wordpress,可能存在安装或更新插件要求输入FTP密码,uploads
权限等问题,而这一切跟目录/var/www/
权限有关。在网络上找到的解决方法往往不适应,因为不同实例类型(我用的是Ubuntu)的用户名、组、配置文件等不尽相同。所以决定花点时间,了解下,知其然知其所以然。懂了这些,就可以按文件作用设置不同的权限,最大限度保护数据的安全。(汗,我之前将uploads
设成777权限)
1. 问题描述及解决方法
1.1 问题描述
在AWS EC2安装了wordpress,安装或更新插件要求输入FTP密码,如下:
但是AWS EC2无论是SSH或者FTP登录用的都是SSH Keys(RSA加密,文件格式为.pem
),而不是密码。解决这个问题,有两个方法:其一,登录EC2,添加FTP密码;其二,修改/var/www/wordpress/
文件所有者为apache
。
1.2 设/var/www/操作权限
复习了下Ubuntu文件权限,并参考了[2],将/var/www/
操作权限设到最佳状态:
#创建一个新的组www-pub
groupadd www-pub
#将www-data(运行web服务的用户)加到www-pub组中
usermod -a -G www-pub www-data #参数-a表示追加
#将/var/www/的组改成www-pub
chown -R ubuntu:www-pub /var/www
#将/var/www/的权限设成2775
#chmod 2775 /var/www #2表示g+s,即组成员跟文件拥有者ubuntu具有相同的操作权限
#将所有目录操作权限设成2775
find /var/www -type d -exec chmod 2775 {} +
#将所有文件操作权限设成0664
find /var/www -type f -exec chmod 0664 {} +
操蛋的是,www-data
已经拥有所需的所有权限,但更新插件时还是提示我输入ftp密码,求高人指点!
目前的解决方法是:在wp-config.php
文件添加以下行:
define('FS_METHOD', 'direct');
值得注意的是,这一行不能添加在文件的末尾,而是添加在数据库定义后面,详情见我在StackOverflow的提问《WordPress needs the FTP credentials to update plugins》。
2. 用户名和组
2.1. 查看用户名
Ubuntu所有用户信息存储在/etc/passwd
文件,举例如下:
root:x:0:0:root:/root:/bin/bash
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
passwd每一行代表一个用户,包含7个域,分别表示[1]:
login name
optional encrypted password
numerical user ID
numerical group ID
user name or comment field
user home directory
optional user command interpreter
可见,所有用户的密码都是x
,官方文档上说x
表示密码存储在/etc/shadow
文件,其实不尽然,我实例上的/etc/shadow
是一个空文件。实际上,x
在这里表示加密口令,AWS EC2使用key pairs(RSA公钥,密钥)进行验证。
2.2 查看组信息
Ubuntu组信息存储在/etc/group
,每一行表示一个组,由5个域组成,如下:
group_name:passwd:GID:user_list
上述用户名对应的组如下:
root:x:0:
adm:x:4:syslog,ubuntu
dialout:x:20:ubuntu
cdrom:x:24:ubuntu
floppy:x:25:ubuntu
sudo:x:27:ubuntu
audio:x:29:ubuntu
dip:x:30:ubuntu
video:x:44:ubuntu
plugdev:x:46:ubuntu
netdev:x:102:ubuntu
ubuntu:x:1000:
www-data:x:33:
可见,Ubuntu属于多个组并且拥有sudo权限。www-data
是默认运行web服务的用户和组。
3. 文件访问权限
用ls -l可以看到文件的访问权限,举例如下
4 drwxr-xr-x 10 ubuntu ubuntu 4096 Mar 17 2014 wp-admin
4 -rwxr-xr-x 1 ubuntu ubuntu 271 Jan 8 2012 wp-blog-header.php
诸如drwxr-xr-x,第一位表示的是文件类型,常用的是目录d和普通文件-,如下:
- : fichier standard
d : répertoire
l : lien symbolique
b : périphérique "block"
c : périphérique "character"
s : "socket"
接下来9位,3个一组,3组从左到右分别是user(u), group(g), other users/all users(o/a)。3个分别表示:
read(r)
write(w)
execute(x/X) 或 set user or group ID(s/S) 或 restricted deletion flag or sticky bit(t/T)
X表示一些用户有运行权(我没搞懂,没见过),S/T与s/t区别在于:当原文件没有执行权x,再加上s/t,那就变成S/T了。举例如下:
0 -rw-rw-r-- 1 ubuntu ubuntu 0 Jun 6 21:35 tmp.txt
$ chmod u+s tmp.txt ; ls -l
-rwSrw-r-- 1 ubuntu ubuntu 0 Jun 6 21:35 tmp.txt
$ chmod g+x tmp.txt ; chmod g+s tmp.txt ; ls -l
-rwSrwsr-- 1 ubuntu ubuntu 0 Jun 6 21:35 tmp.txt
s和t的功能如下:
u+s/S
: 一个文件设置了u+s
,相当于任何人对该文件的操作权限等同于文件所有者g+s/S
: 一个文件设置了g+s
,文件所属的组对该文件的操作权限等同于文件所有者o/a+t/T
:t/T
只能用于其他用户,一个文件设置了o+t
,对文件尽管有写的权限但不能删除文件
通过chmod
命令可以很方便修改文件或目录的权限,有两种方法:
- 字母模式:
u/g/o/a
+/-
r/w/x/s/t
- 数字模型:如2755,值得注意的是,第一位中的4,2,1分别表示
set user ID, set group ID, sticky
参考资料:
[1] Ubuntu manuals: passwd - the password file
[2] StackOverflow: What's the best way of handling permissions for apache2's user www-data in /var/www?